package com.swyc.osschat.Test.StreamTest.Controller.Stream;

import java.util.Comparator;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;

import com.swyc.osschat.Test.LambdaTest.Bean.Student;

/**
 * @author zhaol@yunrong.cn
 * @version V2.1
 * @since 2.1.0 2019/8/13 10:24
 */
public class StreamCompleteWorksOf {
    private static List<Student> students = Student.generateData();

    public static void main(String[] args) {
        /** forEach(Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。) */
        students.forEach(e->{
            System.out.println("forEach->操作"+Student.beanToString(e));
        });
        /** map(map 方法用于映射每个元素到对应的结果) */
        StringBuilder sb = new StringBuilder("map->操作");
        students.stream().map(m->sb.append(Student.beanToString(m))).distinct().collect(Collectors.toList());
        System.out.println(sb.toString());
        /** filter(filter 方法用于通过设置的条件过滤出元素) */
        StringBuilder sb2 = new StringBuilder("filter->操作");
        students.stream().filter(e->"2".equals(e.getSex())).map(m->sb2.append(Student.beanToString(m))).collect(Collectors.toList());
        System.out.println(sb2.toString());
        /** limit(limit 方法用于获取指定数量的流) */
        students.stream().limit(5).forEach(e->{
            System.out.println("limit->操作"+Student.beanToString(e));
        });
        /** sorted(sorted 方法用于对流进行排序)加reversed()方法表示倒序 */
        students.stream().sorted(Comparator.comparing(Student::getAge)).forEach(e->{
            System.out.println("sorted->操作正序排列"+Student.beanToString(e));
        });
        students.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(e->{
            System.out.println("sorted->操作倒序排列"+Student.beanToString(e));
        });
        /** 并行（parallel）程序(parallelStream 是流并行处理程序的代替方法) */
        students.parallelStream().filter(e->"2".equals(e.getSex())).forEach(e->{
            System.out.println("parallelStream->操作"+Student.beanToString(e));
        });
        /** Collectors */
        String str1 = students.stream().map(Student::beanToString).collect(Collectors.toList()).stream().collect(Collectors.joining(","));
        System.out.println("Collectors->操作"+str1);
        /** IntSummaryStatistics统计（一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上，它们可以用来产生类似如下的统计结果。） */
        IntSummaryStatistics stats = students.stream().mapToInt(Student::getAge).summaryStatistics();
        System.out.println("IntSummaryStatistics->操作列表中最大年龄 : " + stats.getMax());
        System.out.println("IntSummaryStatistics->操作列表中最小年龄 : " + stats.getMin());
        System.out.println("IntSummaryStatistics->操作所有年龄之和 : " + stats.getSum());
        System.out.println("IntSummaryStatistics->操作年龄平均数 : " + stats.getAverage());
    }
}
